Geography information
Geography information-preprocess:kmean
hc<-hclust(dist(crowdfunding),method = "ward.D", members = NULL)
NAs introduced by coercion
plclust(hc)
'plclust' is deprecated.
Use 'plot' instead.
See help("Deprecated")
rect.hclust(hc,k=4)

heatmap(as.matrix(dist(crowdfunding,method= 'euclidean')),labRow = F, labCol = F)
NAs introduced by coercion

result<-cutree(hc,k=4)
result.category<-as.data.frame(result)
colnames(result.category)<-c("MDS_Category")
result.category
pie(result)

barplot(result,col =result )

#table(result)
#summary(result)
plot(result,type = "p",col=result,xlab="State",xaxt="n",ylab="MDS_Category")

library(ggplot2)
mds2 <- -cmdscale(dist(crowdfunding))
NAs introduced by coercion
plot(mds2, type="n", axes=FALSE, ann=FALSE)
text(mds2, labels=rownames(mds2), xpd = NA)

mds<-cmdscale(dist(crowdfunding),k=4,eig=T)
NAs introduced by coercion
x = mds$points[,1]
y = mds$points[,2]
p=ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=5 , alpha=0.8 , aes(colour=factor(result) ))

k2<-kmeans(all,centers=5,nstart=10)
summary(k2)
Length Class Mode
cluster 49 -none- numeric
centers 225 -none- numeric
totss 1 -none- numeric
withinss 5 -none- numeric
tot.withinss 1 -none- numeric
betweenss 1 -none- numeric
size 5 -none- numeric
iter 1 -none- numeric
ifault 1 -none- numeric
Geography Information-simpleplot
par(mfrow=c(1,2) )
#count_of_Grand.Total
plot(crowdfunding$count_of_Grand.Total,col=crowdfunding$Region, main="Count of Project Plot",ylab="Successful Rate",xaxt="n",xlab="State")
#axis(side=1,at=c(1,2,3,4,5,6,7,8),labels=c(crowdfunding$State))
legend("center",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)
#successful.rate
plot(crowdfunding$successful.rate,col=crowdfunding$Region, main="Successful Rate Plot",ylab="Successful Rate",xaxt="n",xlab="State")
#axis(side=1,at=c(1,2,3,4,5,6,7,8),labels=c(crowdfunding$State))
legend("bottomleft",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)
Factors analysis
This article is to analyse the factors to the crowdfunding successful rate. I guess the Education, the inequity of family income and the poverty rate may be related to the crowdfunding successful rate. and in the follow context, i will analyse the those factors.
Firstly, The Statistical Summary ### Factors Analysis-Statistical Summary
library(moments)
summary(crowdfunding$successful.rate)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.1250 0.3179 0.3636 0.3631 0.4095 0.5484
kurtosis(crowdfunding$successful.rate)
[1] 3.630147
summary(crowdfunding$GiniCoeff)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.4190 0.4400 0.4530 0.4522 0.4658 0.4990
kurtosis(crowdfunding$GiniCoeff)
[1] 2.552647
summary(crowdfunding$pAdDeg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.06100 0.07950 0.09200 0.09794 0.11000 0.16400
kurtosis(crowdfunding$pAdDeg)
[1] 3.382781
summary(crowdfunding$PovRate1)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0920 0.1212 0.1480 0.1480 0.1705 0.2190
kurtosis(crowdfunding$PovRate1)
[1] 2.159154
Factors Analysis-Plot for Factors
boxplot(crowdfunding$successful.rate,crowdfunding$GiniCoeff,crowdfunding$pAdDeg,crowdfunding$PovRate1,names = c("Successful Rate","GiniCoeff","Higher Education","PovRate1"),main="Factors Box Plot")
par(mfrow=c(1,3))

plot(crowdfunding$successful.rate,col="red",pch=10,xlab="State",ylab="Successful Rate",xaxt="n",main="Successful Rate Plot")
plot(crowdfunding$GiniCoeff,col="green",pch=18,xlab="State",xaxt="n",ylab="GiniCoeff ",xaxt="n",main="GiniCoeff Plot")
plot(crowdfunding$pAdDeg,col="blue",pch=15,xlab="State",xaxt="n",ylab="Adanced Education Rate",xaxt="n",main="Adanced Education Rate Plot")

#plot(crowdfunding$PovRate1,col="black",pch=16,xlab="State",xaxt="n",ylab="Poverty Rate",xaxt="n",main="Poverty Rate Plot")
library(car)
scatterplot(crowdfunding$successful.rate,log(crowdfunding$average_of_goal_Grand.Total),pch=19)

scatterplot(crowdfunding$successful.rate~crowdfunding$GiniCoeff,pch=19)

scatterplot(crowdfunding$successful.rate~crowdfunding$PovRate1,pch=19)

scatterplot(crowdfunding$successful.rate~crowdfunding$Densitym2,pch=19)

scatterplot(crowdfunding$successful.rate~crowdfunding$pHigh,pch=19)

scatterplot(crowdfunding$successful.rate~crowdfunding$pBatDeg,pch=19)

scatterplot(crowdfunding$successful.rate~crowdfunding$pAdDeg,pch=19)

Factors Analysis-Successful Rate|PovRate1
#redo scatterplot with Successful Rate-PovRate1
scatterplot(crowdfunding$successful.rate,crowdfunding$PovRate1,pch=19)

anova(successful.rate2PovRate1)
Analysis of Variance Table
Response: crowdfunding$successful.rate
Df Sum Sq Mean Sq F value Pr(>F)
crowdfunding$PovRate1 1 0.01157 0.0115683 1.4698 0.2313
Residuals 48 0.37780 0.0078708
ggplot(crowdfunding,aes(x=PovRate1,y=successful.rate,main = "Successful rate~PovRate"))+geom_point(aes(col=Region))+geom_smooth(method = "loess")
par(mfrow=c(1,2))

boxplot(crowdfunding$successful.rate,crowdfunding$PovRate1,names=c("Successful Rate","PovRate1"))
boxplot(crowdfunding$successful.rate[crowdfunding$PovRate1>mean(crowdfunding$PovRate1)],crowdfunding$successful.rate[crowdfunding$PovRate1<=mean(crowdfunding$PovRate1)],col = c("green","deepskyblue"),names=c("Successful%(High PovRate)","Successful%(Low PovRate)"),xlab="Successful rate by PovRate1")

t.test(crowdfunding$successful.rate[crowdfunding$PovRate1>mean(crowdfunding$PovRate1)],crowdfunding$successful.rate[crowdfunding$PovRate1<=mean(crowdfunding$PovRate1)])
Welch Two Sample t-test
data: crowdfunding$successful.rate[crowdfunding$PovRate1 > mean(crowdfunding$PovRate1)] and crowdfunding$successful.rate[crowdfunding$PovRate1 <= mean(crowdfunding$PovRate1)]
t = -0.01904, df = 43.704, p-value = 0.9849
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.05105839 0.05010288
sample estimates:
mean of x mean of y
0.3628157 0.3632935
plot(crowdfunding$PovRate1,crowdfunding$successful.rate,pch=19,col=crowdfunding$Region,ylab="Successful Rate",xlab="PovRate1",main="Successful Rate-PovRate1 Plot with lowess line")
points(lowess(crowdfunding$PovRate1,crowdfunding$successful.rate,f=1/3),pch=4,col="orange",type="l")
#abline(lm(crowdfunding$successful.rate~crowdfunding$PovRate1),col="orange")
legend("bottomright",legend = levels(crowdfunding$Region),cex = 0.8, pch = 19,col=1:4)
qqplot(crowdfunding$PovRate1,crowdfunding$successful.rate,pch=1,col=crowdfunding$Region,main="QQ plot: (Successful Rate & PovRate)")
qqline(crowdfunding$PovRate1 ,crowdfunding$successful.rate,col="red")
the condition has length > 1 and only the first element will be used
legend("topleft",legend = levels(crowdfunding$Region), pch = 19,col=1:3)
par(mfrow=c(1,1))

#qqnorm(crowdfunding$successful.rate,col=crowdfunding$Region,xlab="Successful Rate")
#qqline(crowdfunding$successful.rate,col="red")
qqnorm(crowdfunding$PovRate1,col=crowdfunding$Region,pch=18,xlab ="PovRate1")
qqline(crowdfunding$PovRate1,col="red")

Factors Analysis-Successful Rate|GiniCoeff
ggplot(crowdfunding,aes(x=GiniCoeff,y=successful.rate,main = "Successful rate~GiniCoeff"))+geom_point(aes(col=Region))+geom_smooth(method = "loess")
anova(successful.rate2GiniCoeff)
Analysis of Variance Table
Response: crowdfunding$successful.rate
Df Sum Sq Mean Sq F value Pr(>F)
crowdfunding$GiniCoeff 1 0.06236 0.062361 9.1537 0.003981 **
Residuals 48 0.32701 0.006813
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow=c(1,2))

boxplot(crowdfunding$successful.rate,crowdfunding$GiniCoeff,names=c("Successful rate","GiniCoeff"))
boxplot(crowdfunding$successful.rate[crowdfunding$GiniCoeff>mean(crowdfunding$GiniCoeff)],crowdfunding$successful.rate[crowdfunding$GiniCoeff<=mean(crowdfunding$GiniCoeff)],col = c("darkorchid2","dodgerblue"),names=c("Successful%(High GiniCoeff)","Successful%(Low GiniCoeff)"),xlab="Successful rate by GiniCoeff")

t.test(crowdfunding$successful.rate[crowdfunding$GiniCoeff>mean(crowdfunding$GiniCoeff)],crowdfunding$successful.rate[crowdfunding$GiniCoeff<=mean(crowdfunding$GiniCoeff)])
Welch Two Sample t-test
data: crowdfunding$successful.rate[crowdfunding$GiniCoeff > mean(crowdfunding$GiniCoeff)] and crowdfunding$successful.rate[crowdfunding$GiniCoeff <= mean(crowdfunding$GiniCoeff)]
t = 1.6383, df = 43.111, p-value = 0.1086
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.009375926 0.090607105
sample estimates:
mean of x mean of y
0.3833720 0.3427564
plot(crowdfunding$successful.rate,crowdfunding$GiniCoeff,f=1/3 ,pch=19,col="blue",xlab="Successful Rate",ylab="GiniCoeff",main="Successful Rate-GiniCoeff Plot with lowess line")
points(lowess(crowdfunding$successful.rate,crowdfunding$GiniCoeff,f=1/3),pch=4,col="red",type="l")
qqplot(crowdfunding$successful.rate,crowdfunding$GiniCoeff,pch=19,col="red",main="Q-Q Plot: Successful Rate-GiniCoeff")
qqline(crowdfunding$successful.rate,crowdfunding$GiniCoeff)
the condition has length > 1 and only the first element will be used
#qqnorm(crowdfunding$successful.rate,col="orange",xlab="Successful Rate")
#qqline(crowdfunding$successful.rate,col="red")
par(mfrow=c(1,1))

qqnorm(crowdfunding$GiniCoeff,col="blue",pch=20,xlab="GiniCoeff")
qqline(crowdfunding$GiniCoeff,col="red")

Factors Analysis-Successful Rate|Adanced Education
ggplot(crowdfunding,aes(x=pAdDeg,y=successful.rate,main = "Successful rate~GiniCoeff"))+geom_point(aes(col=Region))+geom_smooth(method = "loess")
anova(successful.rate2pAdDeg)
Analysis of Variance Table
Response: crowdfunding$successful.rate
Df Sum Sq Mean Sq F value Pr(>F)
crowdfunding$pAdDeg 1 0.05947 0.059469 8.6527 0.005015 **
Residuals 48 0.32990 0.006873
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow=c(1,2))

boxplot(crowdfunding$successful.rate,crowdfunding$pAdDeg,names=c("Successful rate","Adanced Education"))
boxplot(crowdfunding$successful.rate[crowdfunding$pAdDeg>mean(crowdfunding$pAdDeg)],crowdfunding$successful.rate[crowdfunding$pAdDeg<=mean(crowdfunding$pAdDeg)],col = c("darkorchid2","dodgerblue"),names=c("Successful%(High Adanced Education)","Successful%(Low Adanced Education)"),xlab="Successful rate by Adanced Education")

t.test(crowdfunding$successful.rate[crowdfunding$pAdDeg>mean(crowdfunding$pAdDeg)],crowdfunding$successful.rate[crowdfunding$pAdDeg<=mean(crowdfunding$pAdDeg)])
Welch Two Sample t-test
data: crowdfunding$successful.rate[crowdfunding$pAdDeg > mean(crowdfunding$pAdDeg)] and crowdfunding$successful.rate[crowdfunding$pAdDeg <= mean(crowdfunding$pAdDeg)]
t = 3.5483, df = 45.573, p-value = 0.0009119
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.03480093 0.12610121
sample estimates:
mean of x mean of y
0.4097258 0.3292747
plot(crowdfunding$successful.rate,crowdfunding$pAdDeg,f=1/3 ,pch=19,col="blue",xlab="Successful Rate",ylab="Adanced Education",main="Successful Rate-Adanced Education Plot with lowess line")
points(lowess(crowdfunding$successful.rate,crowdfunding$pAdDeg,f=1/3),pch=4,col="red",type="l")
qqplot(crowdfunding$successful.rate,crowdfunding$pAdDeg,pch=19,col="red",main="Q-Q Plot: Successful Rate-Adanced Education")
qqline(crowdfunding$successful.rate,crowdfunding$pAdDeg)
the condition has length > 1 and only the first element will be used
#qqnorm(crowdfunding$successful.rate,col="orange",xlab="Successful Rate")
#qqline(crowdfunding$successful.rate,col="red")
par(mfrow=c(1,1))

qqnorm(crowdfunding$pAdDeg,col="blue",pch=20,xlab="Adanced Education")
qqline(crowdfunding$pAdDeg,col="red")

LS0tCnRpdGxlOiAiQXNzaWdubWVudCIKYXV0aG9yOiAic24wd2ZyZWUiCmRhdGU6ICIxMi8xNi8yMDE2IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgoKIyMgSW1wb3J0IERhdGEKYGBge3IgaW1wb3J0IGRhdGV9CmNyb3dkZnVuZGluZzwtcmVhZC5jc3YoICJmb3Jxcm0uY3N2IiAsaGVhZGVyPTEpCmhlYWQoY3Jvd2RmdW5kaW5nKQpsaWJyYXJ5KGxtdGVzdCkKcm93bmFtZXMoY3Jvd2RmdW5kaW5nKTwtY3Jvd2RmdW5kaW5nJFN0YXRlCmBgYAoKIyMgRmluZCBUb3BpY3MKIyMjIDEuR2VvZ3JhcGh5IGluZm9ybWF0aW9uCgoxLiBHZW9ncmFwaHkgaW5mb3JtYXRpb246Zm91bmQgdGhlIHNpZ25pZmljYWxseSBkaWZmZXJlbnQgYnkgc3RhdGUvYnkgcmVnaW9uCiAgKyBBbW91bnQKICArIHN1Y2Nlc3NmdWxsIHJhdGUKICB3aXRoaW4gZ3JhcGh5L3Bsb3QKICAKIyMjIDIuIEZhY3RvcnMgYW5hbHlzaXM6CiAgCjIuIGZhY3RvcnM6c3R1ZHlpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFN1Y2Nlc3NmdWwgUmF0ZSBhbmQgb3RoZXIgZmFjdG9yczoKICArIEhpZ2hlciBFZHVjdGlvbjpwQWREZWc7CiAgKyBHaW5pY29lZmYKICAjIGF2ZXJhZ2VfcGxlZGdlZF9hbW91bnRfb2ZfR3JhbmQuVG90YWwjCgoKIyMjIDMuIFRvdGFsIHJlZ3Jlc3Npb24KYGBge3IgcmVncmVzc2lvbn0KCnN1Y2Nlc3NmdWwucmF0ZTJHaW5pQ29lZmY8LWxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikjc2lnbmlmaWNhbnQ6MC4wMDM5OApzdW1tYXJ5KHN1Y2Nlc3NmdWwucmF0ZTJHaW5pQ29lZmYpCgpzdWNjZXNzZnVsLnJhdGUyTlBvdjAwMHM8LWxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGV+Y3Jvd2RmdW5kaW5nJE5Qb3YwMDBzKSMwLjIzMQpzdW1tYXJ5KHN1Y2Nlc3NmdWwucmF0ZTJOUG92MDAwcykKCnN1bW1hcnkobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZX5jcm93ZGZ1bmRpbmckcEhpZ2gpKSNiYWQ6MC4yMzIwIApzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGV+Y3Jvd2RmdW5kaW5nJHBCYXREZWcpKSNsb3c6MC4wNTUxMQoKc3VjY2Vzc2Z1bC5yYXRlMnBBZERlZzwtbG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZX5jcm93ZGZ1bmRpbmckcEFkRGVnKSNzaWduaWZpY2FudDowLjAwNTAxCnN1bW1hcnkoc3VjY2Vzc2Z1bC5yYXRlMnBBZERlZykKCiNzdXBwbGVtZW50IHJlZ3Jlc3Npb24Kc3VtbWFyeShsbShjcm93ZGZ1bmRpbmckR2luaUNvZWZmfmNyb3dkZnVuZGluZyRwQWREZWcpKSNzaWduaWZpY2FudDowLjAzNTMKCgpzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbH5jcm93ZGZ1bmRpbmckUG9wMjAxMCkpI3NpZ25pZmljYW50OjAuMDM1MwoKI3N1bW1hcnkobG0oc3VjY2Vzc2Z1bC5yYXRlMlBvdlJhdGUxJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckcEFkRGVnKSkjMC4wMDAzODgxCiNzdW1tYXJ5KGxtKHN1Y2Nlc3NmdWwucmF0ZTJQb3ZSYXRlMSRyZXNpZHVhbHN+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikpIzAuMDI2NAoKc3VtbWFyeShsbShzdWNjZXNzZnVsLnJhdGUyR2luaUNvZWZmJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckcEFkRGVnKSkjcmVzaWR1YWxzIH4gQURkZWc6MC4wMzY4CiNzdW1tYXJ5KGxtKHN1Y2Nlc3NmdWwucmF0ZTJHaW5pQ29lZmYkcmVzaWR1YWxzfmNyb3dkZnVuZGluZyRQb3ZSYXRlMSkpI3Jlc2lkdWFscyB+IFBvdlJhdGUxOjAuNzcxCgojc3VtbWFyeShsbShzdWNjZXNzZnVsLnJhdGUycEFkRGVnJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckUG92UmF0ZTEpKSMwLjAwNDUwNQpzdW1tYXJ5KGxtKHN1Y2Nlc3NmdWwucmF0ZTJwQWREZWckcmVzaWR1YWxzfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKSMwLjAyOTUKCgojc3VtbWFyeShsbShsb2coY3Jvd2RmdW5kaW5nJGF2ZXJhZ2VfcGxlZGdlZF9hbW91bnRfb2ZfR3JhbmQuVG90YWwpfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKSMwLjAyMzU3CgoKYGBgCgojIyBHZW9ncmFwaHkgaW5mb3JtYXRpb24KCgoKIyMjIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi1wcmVwcm9jZXNzOmttZWFuCgpgYGB7ciBrbWVhbnN9CmhjPC1oY2x1c3QoZGlzdChjcm93ZGZ1bmRpbmcpLG1ldGhvZCA9ICJ3YXJkLkQiLCBtZW1iZXJzID0gTlVMTCkKcGxjbHVzdChoYykKcmVjdC5oY2x1c3QoaGMsaz00KQoKCmhlYXRtYXAoYXMubWF0cml4KGRpc3QoY3Jvd2RmdW5kaW5nLG1ldGhvZD0gJ2V1Y2xpZGVhbicpKSxsYWJSb3cgPSBGLCBsYWJDb2wgPSBGKQpyZXN1bHQ8LWN1dHJlZShoYyxrPTQpCnJlc3VsdC5jYXRlZ29yeTwtYXMuZGF0YS5mcmFtZShyZXN1bHQpCmNvbG5hbWVzKHJlc3VsdC5jYXRlZ29yeSk8LWMoIk1EU19DYXRlZ29yeSIpCnJlc3VsdC5jYXRlZ29yeQpwaWUocmVzdWx0KQpiYXJwbG90KHJlc3VsdCxjb2wgPXJlc3VsdCApCiN0YWJsZShyZXN1bHQpCiNzdW1tYXJ5KHJlc3VsdCkKcGxvdChyZXN1bHQsdHlwZSA9ICJwIixjb2w9cmVzdWx0LHhsYWI9IlN0YXRlIix4YXh0PSJuIix5bGFiPSJNRFNfQ2F0ZWdvcnkiKQoKCmxpYnJhcnkoZ2dwbG90MikKbWRzMiA8LSAtY21kc2NhbGUoZGlzdChjcm93ZGZ1bmRpbmcpKQpwbG90KG1kczIsIHR5cGU9Im4iLCBheGVzPUZBTFNFLCBhbm49RkFMU0UpCnRleHQobWRzMiwgbGFiZWxzPXJvd25hbWVzKG1kczIpLCB4cGQgPSBOQSkKCm1kczwtY21kc2NhbGUoZGlzdChjcm93ZGZ1bmRpbmcpLGs9NCxlaWc9VCkKeCA9IG1kcyRwb2ludHNbLDFdCnkgPSBtZHMkcG9pbnRzWywyXQpwPWdncGxvdChkYXRhLmZyYW1lKHgseSksYWVzKHgseSkpCnArZ2VvbV9wb2ludChzaXplPTUgLCBhbHBoYT0wLjggLCBhZXMoY29sb3VyPWZhY3RvcihyZXN1bHQpICkpCmsyPC1rbWVhbnMoYWxsLGNlbnRlcnM9NSxuc3RhcnQ9MTApCnN1bW1hcnkoazIpCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNyb3dkZnVuZGluZy5iYWNrdXA8LWNyb3dkZnVuZGluZwoKcmVzdWx0LmNhdGVnb3J5WyJTdGF0ZSJdPC1yb3cubmFtZXMocmVzdWx0LmNhdGVnb3J5KQoKY3Jvd2RmdW5kaW5nPC1jcm93ZGZ1bmRpbmdbYygiU3RhdGUiLCJzdWNjZXNzZnVsLnJhdGUiLCJSZWdpb24iLCJjb3VudF9vZl9HcmFuZC5Ub3RhbCIsIkdpbmlDb2VmZiIsInBBZERlZyIsInBIaWdoIiwicEJhdERlZyIsIlBvcDIwMTAiKV0KY3Jvd2RmdW5kaW5nJFBvcDIwMTA8LWxvZyhjcm93ZGZ1bmRpbmckUG9wMjAxMCkKI2Nyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbDwtbG9nKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbCkKY3Jvd2RmdW5kaW5nPC1tZXJnZShjcm93ZGZ1bmRpbmcscmVzdWx0LmNhdGVnb3J5LGFsbC54PVRSVUUpCnJvdy5uYW1lcyhjcm93ZGZ1bmRpbmcpPC1jcm93ZGZ1bmRpbmckU3RhdGUKCmNyb3dkZnVuZGluZyRTdGF0ZTwtTlVMTApjcm93ZGZ1bmRpbmcKICAKYGBgCgoKCgoKCiMjIyBHZW9ncmFwaHkgSW5mb3JtYXRpb24tc2ltcGxlcGxvdApgYGB7ciBHZW9ncmFwaHkgSW5mb3JtYXRpb24tc2ltcGxlcGxvdH0KcGFyKG1mcm93PWMoMSwyKSApCgojY291bnRfb2ZfR3JhbmQuVG90YWwKcGxvdChjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWwsY29sPWNyb3dkZnVuZGluZyRSZWdpb24sIG1haW49IkNvdW50IG9mIFByb2plY3QgIFBsb3QiLHlsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIseGF4dD0ibiIseGxhYj0iU3RhdGUiKQojYXhpcyhzaWRlPTEsYXQ9YygxLDIsMyw0LDUsNiw3LDgpLGxhYmVscz1jKGNyb3dkZnVuZGluZyRTdGF0ZSkpCmxlZ2VuZCgiY2VudGVyIixsZWdlbmQgPSBsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksY2V4ID0gMC44LCBwY2ggPSAxLGNvbD0xOjQpCgoKCiNzdWNjZXNzZnVsLnJhdGUKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNvbD1jcm93ZGZ1bmRpbmckUmVnaW9uLCBtYWluPSJTdWNjZXNzZnVsIFJhdGUgUGxvdCIseWxhYj0iU3VjY2Vzc2Z1bCBSYXRlIix4YXh0PSJuIix4bGFiPSJTdGF0ZSIpCiNheGlzKHNpZGU9MSxhdD1jKDEsMiwzLDQsNSw2LDcsOCksbGFiZWxzPWMoY3Jvd2RmdW5kaW5nJFN0YXRlKSkKbGVnZW5kKCJib3R0b21sZWZ0IixsZWdlbmQgPSBsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksY2V4ID0gMC44LCBwY2ggPSAxLGNvbD0xOjQpCmBgYAoKIyMjIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi1ib3hwbG90CmBgYHtyIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi1ib3hwbG90fQpwYXIobWZyb3c9YygxLDMpKQojQm94cGxvdCBmb3Igc3VjY2Vzc2Z1bC5yYXRlIGFuZCBjb3VudF9vZl9HcmFuZC5Ub3RhbAojY291bnRfb2ZfR3JhbmQuVG90YWwKYm94cGxvdChjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSxjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdLGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSxjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSxuYW1lcz1sZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksbWFpbj0iQ291bnQgb2YgUHJvamVjdHMgQm94UGxvdCBieSBSZWdpb24iKQoKYm94cGxvdChsb2coY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0pLGxvZyhjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKSxsb2coY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdKSxsb2coY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pLG5hbWVzPWxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSxtYWluPSJMb2cgQ291bnQgb2YgUHJvamVjdHMgQm94UGxvdCBieSBSZWdpb24iKQoKI3N1Y2Nlc3NmdWwucmF0ZQpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSxuYW1lcz1sZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlIEJveFBsb3QgYnkgUmVnaW9uIikKYGBgCgoKIyMjIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi10LnRlc3QKYGBge3IgR2VvZ3JhcGh5IGluZm9ybWF0aW9uLXQudGVzdH0KI3QudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCiN0LnRlc3QoY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0sY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSkKCgojY2FsY3VhbHRlIFAgVmFsdWUgaW4gdGhlIHQudGVzdCBvZiBTdWNjZXNzZnVsIFJhdGUgYnkgUmVnaW9uIAoKcD1OVUxMCnRlbXA8LU5VTEwKZm9yIChsb2NhdGlvbjEgaW4gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKXsKICBmb3IgKGxvY2F0aW9uMiBpbiBjKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkpewogICAgaWYgKDEpewogICAgICB0ZW1wPC10LnRlc3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT1sb2NhdGlvbjFdLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09bG9jYXRpb24yXSkKICAgICAgaWYodGVtcCRwLnZhbHVlPD0wLjEpewogICAgICAgICNwcmludChjKGxvY2F0aW9uMSxsb2NhdGlvbjIsdGVtcCRwLnZhbHVlKSkKICAgICAgfQogICAgICBwPC1jKHAsdGVtcCRwLnZhbHVlKX19fQpTUi50LnRlc3QucC52bGF1ZTwtYXMuZGF0YS5mcmFtZShtYXRyaXgocCw0LDQpLHJvdy5uYW1lcyA9IGMobGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pKSkKY29sbmFtZXMoU1IudC50ZXN0LnAudmxhdWUpPC1jKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkKcHJpbnQoIlN1Y2Nlc3NmdWwgUmF0ZSBieSBSZWdpb24iKQpTUi50LnRlc3QucC52bGF1ZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2NhbGN1YWx0ZSBQIFZhbHVlIGluIHRoZSB0LnRlc3Qgb2YgQ291bnQgb2YgcHJvamVjdHMgYnkgUmVnaW9uIAoKcD1OVUxMCnRlbXA8LU5VTEwKZm9yIChsb2NhdGlvbjEgaW4gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKXsKICBmb3IgKGxvY2F0aW9uMiBpbiBjKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkpewogICAgaWYgKDEpewogICAgICB0ZW1wPC10LnRlc3QobG9nKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT1sb2NhdGlvbjFdKSxsb2coY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PWxvY2F0aW9uMl0pKQogICAgICBpZih0ZW1wJHAudmFsdWU8PTAuMSl7CiAgICAgICAgI3ByaW50KGMobG9jYXRpb24xLGxvY2F0aW9uMix0ZW1wJHAudmFsdWUpKQogICAgICB9CiAgICAgIHA8LWMocCx0ZW1wJHAudmFsdWUpfX19CkNQLnQudGVzdC5wLnZsYXVlPC1hcy5kYXRhLmZyYW1lKG1hdHJpeChwLDQsNCkscm93Lm5hbWVzID0gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKQpjb2xuYW1lcyhDUC50LnRlc3QucC52bGF1ZSk8LWMobGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pKQpwcmludCgiQ291bnQgb2YgUHJvamVjdHMgYnkgUmVnaW9uICIpCkNQLnQudGVzdC5wLnZsYXVlCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojY2FsY3VhbHRlIFAgVmFsdWUgaW4gdGhlIHQudGVzdCBvZiBDb3VudCBvZiBwcm9qZWN0cyBieSBrbWVhbnMgCiJNRFMtQ2F0ZWdvcnkiCnA9TlVMTAoKdGVtcDwtTlVMTApmb3IgKGxvY2F0aW9uMSBpbiAxOjQpewogIGZvciAobG9jYXRpb24yIGluIDE6NCl7CiAgICBpZiAoMSl7CiAgICAgIHRlbXA8LXQudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PWxvY2F0aW9uMV0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZVtjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT1sb2NhdGlvbjJdKQogICAgICBpZih0ZW1wJHAudmFsdWU8PTAuMSl7CiAgICAgICAgcHJpbnQoYyhsb2NhdGlvbjEsbG9jYXRpb24yLHRlbXAkcC52YWx1ZSkpCiAgICAgIH0KICAgICAgcDwtYyhwLHRlbXAkcC52YWx1ZSl9fX0KTURTUi50LnRlc3QucC52bGF1ZTwtYXMuZGF0YS5mcmFtZShtYXRyaXgocCw0LDQpLHJvdy5uYW1lcyA9IGMoMTo0KSkKY29sbmFtZXMoTURTUi50LnRlc3QucC52bGF1ZSk8LWMoMTo0KQpwcmludCgiU3VjY2Vzc2Z1bCBSYXRlIGJ5IFJlZ2lvbiIpCk1EU1IudC50ZXN0LnAudmxhdWUKCgpgYGAKCiMjIEZhY3RvcnMgYW5hbHlzaXMKVGhpcyBhcnRpY2xlIGlzIHRvIGFuYWx5c2UgdGhlIGZhY3RvcnMgdG8gdGhlIGNyb3dkZnVuZGluZyBzdWNjZXNzZnVsIHJhdGUuCkkgZ3Vlc3MgdGhlIEVkdWNhdGlvbiwgdGhlIGluZXF1aXR5IG9mIGZhbWlseSBpbmNvbWUgYW5kIHRoZSBwb3ZlcnR5IHJhdGUgbWF5IGJlIHJlbGF0ZWQgdG8gdGhlIGNyb3dkZnVuZGluZyBzdWNjZXNzZnVsIHJhdGUuIGFuZCBpbiB0aGUgZm9sbG93IGNvbnRleHQsIGkgd2lsbCBhbmFseXNlIHRoZSB0aG9zZSBmYWN0b3JzLgoKRmlyc3RseSwgVGhlIFN0YXRpc3RpY2FsIFN1bW1hcnkKIyMjIEZhY3RvcnMgQW5hbHlzaXMtU3RhdGlzdGljYWwgU3VtbWFyeQpgYGB7ciBGYWN0b3JzIEFuYWx5c2lzLVN0YXRpc3RpY2FsIFN1bW1hcnl9CmxpYnJhcnkobW9tZW50cykKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSkKa3VydG9zaXMoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSkKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKa3VydG9zaXMoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJHBBZERlZykKa3VydG9zaXMoY3Jvd2RmdW5kaW5nJHBBZERlZykKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJFBvdlJhdGUxKQprdXJ0b3Npcyhjcm93ZGZ1bmRpbmckUG92UmF0ZTEpCgpgYGAKCiMjIyBGYWN0b3JzIEFuYWx5c2lzLVBsb3QgZm9yIEZhY3RvcnMKYGBge3IgUGxvdCBmb3IgRmFjdG9yc30KCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGNyb3dkZnVuZGluZyRwQWREZWcsY3Jvd2RmdW5kaW5nJFBvdlJhdGUxLG5hbWVzID0gYygiU3VjY2Vzc2Z1bCBSYXRlIiwiR2luaUNvZWZmIiwiSGlnaGVyIEVkdWNhdGlvbiIsIlBvdlJhdGUxIiksbWFpbj0iRmFjdG9ycyBCb3ggUGxvdCIpCgpwYXIobWZyb3c9YygxLDMpKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUsY29sPSJyZWQiLHBjaD0xMCx4bGFiPSJTdGF0ZSIseWxhYj0iU3VjY2Vzc2Z1bCBSYXRlIix4YXh0PSJuIixtYWluPSJTdWNjZXNzZnVsIFJhdGUgUGxvdCIpCnBsb3QoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjb2w9ImdyZWVuIixwY2g9MTgseGxhYj0iU3RhdGUiLHhheHQ9Im4iLHlsYWI9IkdpbmlDb2VmZiAiLHhheHQ9Im4iLG1haW49IkdpbmlDb2VmZiBQbG90IikKcGxvdChjcm93ZGZ1bmRpbmckcEFkRGVnLGNvbD0iYmx1ZSIscGNoPTE1LHhsYWI9IlN0YXRlIix4YXh0PSJuIix5bGFiPSJBZGFuY2VkIEVkdWNhdGlvbiBSYXRlIix4YXh0PSJuIixtYWluPSJBZGFuY2VkIEVkdWNhdGlvbiBSYXRlIFBsb3QiKQojcGxvdChjcm93ZGZ1bmRpbmckUG92UmF0ZTEsY29sPSJibGFjayIscGNoPTE2LHhsYWI9IlN0YXRlIix4YXh0PSJuIix5bGFiPSJQb3ZlcnR5IFJhdGUiLHhheHQ9Im4iLG1haW49IlBvdmVydHkgUmF0ZSBQbG90IikKCmBgYAoKCgoKCmBgYHtyIHNjYXR0ZXJwbG90fQpsaWJyYXJ5KGNhcikKc2NhdHRlcnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxsb2coY3Jvd2RmdW5kaW5nJGF2ZXJhZ2Vfb2ZfZ29hbF9HcmFuZC5Ub3RhbCkscGNoPTE5KQpzY2F0dGVycGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYscGNoPTE5KQpzY2F0dGVycGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlfmNyb3dkZnVuZGluZyRQb3ZSYXRlMSxwY2g9MTkpCnNjYXR0ZXJwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGV+Y3Jvd2RmdW5kaW5nJERlbnNpdHltMixwY2g9MTkpCnNjYXR0ZXJwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGV+Y3Jvd2RmdW5kaW5nJHBIaWdoLHBjaD0xOSkKc2NhdHRlcnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZX5jcm93ZGZ1bmRpbmckcEJhdERlZyxwY2g9MTkpCnNjYXR0ZXJwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGV+Y3Jvd2RmdW5kaW5nJHBBZERlZyxwY2g9MTkpCgoKYGBgCgoKIyMjIEZhY3RvcnMgQW5hbHlzaXMtU3VjY2Vzc2Z1bCBSYXRlfFBvdlJhdGUxCmBgYHtyIFN1Y2Nlc3NmdWwgUmF0ZS1Qb3ZSYXRlMX0KI3JlZG8gc2NhdHRlcnBsb3Qgd2l0aCBTdWNjZXNzZnVsIFJhdGUtUG92UmF0ZTEKc2NhdHRlcnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckUG92UmF0ZTEscGNoPTE5KQoKYW5vdmEoc3VjY2Vzc2Z1bC5yYXRlMlBvdlJhdGUxKQoKZ2dwbG90KGNyb3dkZnVuZGluZyxhZXMoeD1Qb3ZSYXRlMSx5PXN1Y2Nlc3NmdWwucmF0ZSxtYWluID0gIlN1Y2Nlc3NmdWwgcmF0ZX5Qb3ZSYXRlIikpK2dlb21fcG9pbnQoYWVzKGNvbD1SZWdpb24pKStnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiKQoKcGFyKG1mcm93PWMoMSwyKSkKCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckUG92UmF0ZTEsbmFtZXM9YygiU3VjY2Vzc2Z1bCBSYXRlIiwiUG92UmF0ZTEiKSkKYm94cGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRQb3ZSYXRlMT5tZWFuKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSldLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJFBvdlJhdGUxPD1tZWFuKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSldLGNvbCA9IGMoImdyZWVuIiwiZGVlcHNreWJsdWUiKSxuYW1lcz1jKCJTdWNjZXNzZnVsJShIaWdoIFBvdlJhdGUpIiwiU3VjY2Vzc2Z1bCUoTG93IFBvdlJhdGUpIikseGxhYj0iU3VjY2Vzc2Z1bCByYXRlIGJ5IFBvdlJhdGUxIikKCgoKdC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJFBvdlJhdGUxPm1lYW4oY3Jvd2RmdW5kaW5nJFBvdlJhdGUxKV0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZVtjcm93ZGZ1bmRpbmckUG92UmF0ZTE8PW1lYW4oY3Jvd2RmdW5kaW5nJFBvdlJhdGUxKV0pCgoKCnBsb3QoY3Jvd2RmdW5kaW5nJFBvdlJhdGUxLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUscGNoPTE5LGNvbD1jcm93ZGZ1bmRpbmckUmVnaW9uLHlsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIseGxhYj0iUG92UmF0ZTEiLG1haW49IlN1Y2Nlc3NmdWwgUmF0ZS1Qb3ZSYXRlMSBQbG90IHdpdGggbG93ZXNzIGxpbmUiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGY9MS8zKSxwY2g9NCxjb2w9Im9yYW5nZSIsdHlwZT0ibCIpCiNhYmxpbmUobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZX5jcm93ZGZ1bmRpbmckUG92UmF0ZTEpLGNvbD0ib3JhbmdlIikKbGVnZW5kKCJib3R0b21yaWdodCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLGNleCA9IDAuOCwgcGNoID0gMTksY29sPTE6NCkKCgpxcXBsb3QoY3Jvd2RmdW5kaW5nJFBvdlJhdGUxLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUscGNoPTEsY29sPWNyb3dkZnVuZGluZyRSZWdpb24sbWFpbj0iUVEgcGxvdDogKFN1Y2Nlc3NmdWwgUmF0ZSAmIFBvdlJhdGUpIikKcXFsaW5lKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSAsY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjb2w9InJlZCIpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLCBwY2ggPSAxOSxjb2w9MTozKQoKCgoKcGFyKG1mcm93PWMoMSwxKSkKI3Fxbm9ybShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNvbD1jcm93ZGZ1bmRpbmckUmVnaW9uLHhsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIpCiNxcWxpbmUoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjb2w9InJlZCIpCnFxbm9ybShjcm93ZGZ1bmRpbmckUG92UmF0ZTEsY29sPWNyb3dkZnVuZGluZyRSZWdpb24scGNoPTE4LHhsYWIgPSJQb3ZSYXRlMSIpCnFxbGluZShjcm93ZGZ1bmRpbmckUG92UmF0ZTEsY29sPSJyZWQiKQpgYGAKCgoKCgojIyMgRmFjdG9ycyBBbmFseXNpcy1TdWNjZXNzZnVsIFJhdGV8R2luaUNvZWZmCmBgYHtyIFN1Y2Nlc3NmdWwgUmF0ZS1HaW5pQ29lZmZ9CgpnZ3Bsb3QoY3Jvd2RmdW5kaW5nLGFlcyh4PUdpbmlDb2VmZix5PXN1Y2Nlc3NmdWwucmF0ZSxtYWluID0gIlN1Y2Nlc3NmdWwgcmF0ZX5HaW5pQ29lZmYiKSkrZ2VvbV9wb2ludChhZXMoY29sPVJlZ2lvbikpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIpCgphbm92YShzdWNjZXNzZnVsLnJhdGUyR2luaUNvZWZmKQoKCgpwYXIobWZyb3c9YygxLDIpKQoKCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmLG5hbWVzPWMoIlN1Y2Nlc3NmdWwgcmF0ZSIsIkdpbmlDb2VmZiIpKQpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZj5tZWFuKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRHaW5pQ29lZmY8PW1lYW4oY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZildLGNvbCA9IGMoImRhcmtvcmNoaWQyIiwiZG9kZ2VyYmx1ZSIpLG5hbWVzPWMoIlN1Y2Nlc3NmdWwlKEhpZ2ggR2luaUNvZWZmKSIsIlN1Y2Nlc3NmdWwlKExvdyBHaW5pQ29lZmYpIikseGxhYj0iU3VjY2Vzc2Z1bCByYXRlIGJ5IEdpbmlDb2VmZiIpCgoKCgoKdC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZj5tZWFuKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRHaW5pQ29lZmY8PW1lYW4oY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZildKQoKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGY9MS8zICxwY2g9MTksY29sPSJibHVlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiLHlsYWI9IkdpbmlDb2VmZiIsbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlLUdpbmlDb2VmZiBQbG90IHdpdGggbG93ZXNzIGxpbmUiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUsY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixmPTEvMykscGNoPTQsY29sPSJyZWQiLHR5cGU9ImwiKQoKCnFxcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNyb3dkZnVuZGluZyRHaW5pQ29lZmYscGNoPTE5LGNvbD0icmVkIixtYWluPSJRLVEgUGxvdDogU3VjY2Vzc2Z1bCBSYXRlLUdpbmlDb2VmZiIpCnFxbGluZShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpCgoKI3Fxbm9ybShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNvbD0ib3JhbmdlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiKQojcXFsaW5lKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUsY29sPSJyZWQiKQpwYXIobWZyb3c9YygxLDEpKQpxcW5vcm0oY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjb2w9ImJsdWUiLHBjaD0yMCx4bGFiPSJHaW5pQ29lZmYiKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjb2w9InJlZCIpCgpgYGAKCgoKIyMjIEZhY3RvcnMgQW5hbHlzaXMtU3VjY2Vzc2Z1bCBSYXRlfEFkYW5jZWQgRWR1Y2F0aW9uCmBgYHtyIFN1Y2Nlc3NmdWwgUmF0ZS1BZGFuY2VkIEVkdWNhdGlvbn0KZ2dwbG90KGNyb3dkZnVuZGluZyxhZXMoeD1wQWREZWcseT1zdWNjZXNzZnVsLnJhdGUsbWFpbiA9ICJTdWNjZXNzZnVsIHJhdGV+R2luaUNvZWZmIikpK2dlb21fcG9pbnQoYWVzKGNvbD1SZWdpb24pKStnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiKQoKYW5vdmEoc3VjY2Vzc2Z1bC5yYXRlMnBBZERlZykKCnBhcihtZnJvdz1jKDEsMikpCgpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUsY3Jvd2RmdW5kaW5nJHBBZERlZyxuYW1lcz1jKCJTdWNjZXNzZnVsIHJhdGUiLCJBZGFuY2VkIEVkdWNhdGlvbiIpKQpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJHBBZERlZz5tZWFuKGNyb3dkZnVuZGluZyRwQWREZWcpXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRwQWREZWc8PW1lYW4oY3Jvd2RmdW5kaW5nJHBBZERlZyldLGNvbCA9IGMoImRhcmtvcmNoaWQyIiwiZG9kZ2VyYmx1ZSIpLG5hbWVzPWMoIlN1Y2Nlc3NmdWwlKEhpZ2ggQWRhbmNlZCBFZHVjYXRpb24pIiwiU3VjY2Vzc2Z1bCUoTG93IEFkYW5jZWQgRWR1Y2F0aW9uKSIpLHhsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBieSBBZGFuY2VkIEVkdWNhdGlvbiIpCgoKdC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGVbY3Jvd2RmdW5kaW5nJHBBZERlZz5tZWFuKGNyb3dkZnVuZGluZyRwQWREZWcpXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlW2Nyb3dkZnVuZGluZyRwQWREZWc8PW1lYW4oY3Jvd2RmdW5kaW5nJHBBZERlZyldKQoKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckcEFkRGVnLGY9MS8zICxwY2g9MTksY29sPSJibHVlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiLHlsYWI9IkFkYW5jZWQgRWR1Y2F0aW9uIixtYWluPSJTdWNjZXNzZnVsIFJhdGUtQWRhbmNlZCBFZHVjYXRpb24gUGxvdCB3aXRoIGxvd2VzcyBsaW5lIikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNyb3dkZnVuZGluZyRwQWREZWcsZj0xLzMpLHBjaD00LGNvbD0icmVkIix0eXBlPSJsIikKCgpxcXBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwucmF0ZSxjcm93ZGZ1bmRpbmckcEFkRGVnLHBjaD0xOSxjb2w9InJlZCIsbWFpbj0iUS1RIFBsb3Q6IFN1Y2Nlc3NmdWwgUmF0ZS1BZGFuY2VkIEVkdWNhdGlvbiIpCnFxbGluZShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNyb3dkZnVuZGluZyRwQWREZWcpCgoKI3Fxbm9ybShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bC5yYXRlLGNvbD0ib3JhbmdlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiKQojcXFsaW5lKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsLnJhdGUsY29sPSJyZWQiKQpwYXIobWZyb3c9YygxLDEpKQpxcW5vcm0oY3Jvd2RmdW5kaW5nJHBBZERlZyxjb2w9ImJsdWUiLHBjaD0yMCx4bGFiPSJBZGFuY2VkIEVkdWNhdGlvbiIpCnFxbGluZShjcm93ZGZ1bmRpbmckcEFkRGVnLGNvbD0icmVkIikKCmBgYAoK